/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package server.so;

import domen.OpstiDomenskiObjekat;
import server.baza.DataBaseBroker;

/**
 *
 * @author Ivan Ivic
 */
public abstract class OpstaSO {
    public static int signal;
    public static boolean bazaOtvorena = false;

    public int opsteIzvrsenjeSO(OpstiDomenskiObjekat odo)
    {
        signal = 0;

        if (!otvoriBazu())
            return signal;
        izvrsenjeSO(odo);
        proveraUspesnostiTransakcije();
        zatvoriBazu();
        return signal;
    }       

    public abstract int izvrsenjeSO(OpstiDomenskiObjekat odo);
       

    private boolean otvoriBazu()
    {
        if (bazaOtvorena == false)
        {
            signal = DataBaseBroker.getDbb().poveziSeSaBazom(); // 9000,9001,9002,9003,9004
            if (!stanjeOperacijeOpstaSO(signal))
                return false;
        }
        bazaOtvorena = true;
        return true;
    }

    private boolean zatvoriBazu()
    {
        int sig = DataBaseBroker.getDbb().zatvoriKonekciju();  // 9005, 9006
        if (!stanjeOperacijeOpstaSO(sig))
        {
            signal = sig;
            return false;
        }
        bazaOtvorena = false;
        return true;
    }

    private boolean proveraUspesnostiTransakcije()
    {
        int sig;
        if (stanjeOperacije(signal))
        {
            sig = DataBaseBroker.getDbb().commitTransakcije(); // 9007,9008
            if (!stanjeOperacijeOpstaSO(sig))
            {
                signal = sig;
                return false;
            }
        }
        else
        {
            sig = DataBaseBroker.getDbb().rollbackTransakcije();  // 9009, 9010
            if (!stanjeOperacijeOpstaSO(sig))
            {
                signal = sig;
                return false;
            }
        }             
        return true;
    }

    public boolean stanjeOperacijeOpstaSO(int signal)
    {
        switch(signal)
        {
            case 9000:
                prikazi(signal, "Baza uspesno otvorena");
                return true;
            case 9001:
                prikazi(signal, "Neuspesno otvorena baza. Props file greska. Proverite postojanje fajla db.props");
                return false;
            case 9002:
                prikazi(signal, "Neuspesno otvorena baza. Greska oko citanja props file-a");
                return false;
            case 9003:
                prikazi(signal, "Neuspesno otvorena baza. Greska oko uspostavljanja konekcije");
                return false;
            case 9004:
                prikazi(signal, "Neuspesno otvorena baza. Greska oko driver-a");
                return false;
            case 9005:
                prikazi(signal, "Baza uspesno zatvorena");
                return true;
            case 9006:
                prikazi(signal, "Baza neuspesno zatvorena");
                return false;
            case 9007:
                prikazi(signal, "Commit uspesan");
                return true;
            case 9008:
                prikazi(signal, "Commit neuspesan");
                return false;
            case 9009:
                prikazi(signal, "Rollback uspesan");
                return true;
            case 9010:
                prikazi(signal, "Rollback neuspesan");
                return false;
            default:
                return false;                
        }
    }

    public abstract boolean stanjeOperacije(int signal);

    protected void prikazi(int signal, String stanje)
    {
        System.out.println(signal + ": " + stanje);
    }
}
